package kr.co.bettersoft.pushchat.activity;

import kr.co.bettersoft.pushchat.common.CommonConstant;
import kr.co.bettersoft.pushchat.common.PushChatRest;
import kr.co.bettersoft.pushchat.domain.PushChatSMS;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class CertificationStep2 extends Activity{
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수

	String TAG = "CertificationStep2";

	public final int CERTIFICATION_STEP1 = 101;				// 사용자 리스트를 가져온다.
	public final int CERTIFICATION_STEP2 = 102;		// 채팅방을 개설하고 자신을 추가한다.

	//		// 폰트
	//		private Typeface typefaceNanumGothic= null; 
	//		private Typeface typefaceNanumGothicBold = null;

	// 설정 파일 저장소 
	SharedPreferences sharedPrefCustom;		// WaitNumStorePref

	// 파라미터
	String phoneNum = "";
	String tempPhoneNum = "";	// 승인번호를 요청한 전화번호. 승인번호 요청 이후 전화번호 바꾸는것 방지하기 위하여 비교
	Boolean certified = false;	

	// 서버 통신
	PushChatRest pushChatRest;
	String callResult = "";
	String certiResult="";

	// 화면 구성
	TextView titleBar;		// 타이틀
	Button requestCertiNumBtn, certiNumConfirmBtn;	// 인증번호 요청 버튼, 인증 버튼
	EditText userPhoneNumber, userCertiNumber;			// 사용자 전화번호 입력창 , 인증번호 입력창
	ProgressBar pb1;		// 중단 로딩 진행바

	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;		// 키보드 제어

	//////////////////////////////////////////////////////////////////////////////////////////////////////////	

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			Bundle b = msg.getData();
			try{
				if(b.getInt("showErrToast")==1){
					Toast.makeText(CertificationStep2.this,b.getString("msg"), Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("showAlert")==1){					 // 알림 및 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		 
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("showAlert")==2){					 // 인증 성공 
					// 토스트만 띄우고 바로 패스한다.
					Toast.makeText(CertificationStep2.this,b.getString("msg"), Toast.LENGTH_SHORT).show();
					//						Intent intent = new Intent(CertificationStep2.this, IntroActivity.class);				// 인트로 이동시 로딩창이 또 나와
					Intent intent = new Intent(CertificationStep2.this, LoginRegisterChoiceActivity.class);		// 등록/로그인 선택 화면으로
					startActivity(intent);   
					finish();
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.certi_progressbar2);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.certi_progressbar2);
					}
					pb1.setVisibility(View.INVISIBLE);
				}

				switch (msg.what)
				{
				case CERTIFICATION_STEP1 : runOnUiThread(new RunnableCertificationStep_1());					
				break;
				case CERTIFICATION_STEP2 : runOnUiThread(new RunnableCertificationStep_2());					
				break;	
				default : 
					break;
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};


	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );
		setContentView(R.layout.certification_step2_activity);

		pushChatRest = new PushChatRest();

		titleBar = (TextView) findViewById(R.id.title_bar);
		requestCertiNumBtn = (Button) findViewById(R.id.requestCertiNumBtn);	// 인증번호 요청 버튼
		certiNumConfirmBtn = (Button) findViewById(R.id.certiNumConfirmBtn);	// 인증 버튼
		userPhoneNumber = (EditText)findViewById(R.id.userPhoneNumber);		// 전화번호 입력창
		userCertiNumber = (EditText)findViewById(R.id.userCertiNumber);		// 인증번호 입력창

		//			// 폰트 지정.
		//		    typefaceNanumGothic = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothic);  
		//		    typefaceNanumGothicBold = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothicBold);
		//			// 폰트 적용
		//		    titleBar.setTypeface(typefaceNanumGothic);
		//		    userPhoneNumber.setTypeface(typefaceNanumGothic);	
		//		    userCertiNumber.setTypeface(typefaceNanumGothic);		
		//		    requestCertiNumBtn.setTypeface(typefaceNanumGothicBold);
		//		    certiNumConfirmBtn.setTypeface(typefaceNanumGothicBold);

		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도 
		parentLayout = findViewById(R.id.certi_step2_parent_layout);		
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				hideKeyboard();
			}
		});

		// prefs
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);

		userPhoneNumber.setText(phoneNum);
		requestCertiNumBtn.setText(R.string.request_certi_num);			

		// 서버로 전화번호를 보내서 인증번호를 요청한다.
		requestCertiNumBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				hideKeyboard();
				tempPhoneNum = userPhoneNumber.getText()+"";
				if(tempPhoneNum.length()>0){
					try {
						// 인증 1단계.
						handler.sendEmptyMessage(CERTIFICATION_STEP1);			
					} catch (Exception e) {
						e.printStackTrace();
					}
				}else{		// 전번없음
					showResultDialog(getString(R.string.no_phone_num));
				}
			}
		});
		// 인증버튼. 인증번호를 가지고 서버에 인증 절차를 밟는다.
		certiNumConfirmBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				hideKeyboard();
				phoneNum = userPhoneNumber.getText()+"";
				if(phoneNum.length()<1){
					showResultDialog(getString(R.string.no_phone_num));		
				}else if((userCertiNumber.getText()+"").length()!=4){
					showResultDialog(getString(R.string.input_certi_4nums));		// 승인번호 4자리를 입력해주세요. 
				}else if(!(phoneNum.equals(tempPhoneNum))){						
					showResultDialog(getString(R.string.certi_no_certi_num_with_that_phone_num));
				}else{
					// 서버로 인증번호를 보내서 인증번호를 확인한다.
					try {
						// 인증 2단계.
						handler.sendEmptyMessage(CERTIFICATION_STEP2);
					} catch (Exception e) {
						e.printStackTrace();
					} 
				}
			}
		});
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////

	//  pref 에 저장후 다음 단계로 진행.
	public void userCertifiedComplete2(){
		// 인증 완료 후 작업
		SharedPreferences.Editor updateDone =   sharedPrefCustom.edit();
		if(phoneNum.length()>0){
			updateDone.putString("agreedYn", "Y");			// 인증 여부 저장
			updateDone.putString("agreedPhoneNum", phoneNum);		// 전번도 저장	 
			updateDone.putString("agreedQrCode", phoneNum);		// qrCode = phoneNum 
		}
		updateDone.commit();
		showResultDialog2(getString(R.string.certi_success));	// 인증 성공 메시지를 띄우고 바로 다음 화면으로
		certified = true;		
	}
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 비동기


	/**
	 * 러너블. 전화번호를 보내서 인증번호 4자리를 받아온다.
	 */
	class RunnableCertificationStep_1 implements Runnable {
		public void run(){
			new backgroundThreadCertificationStep_1().execute();	
		}
	}
	/**
	 * backgroundThreadCertificationStep_1
	 * 비동기  .  전화번호를 보내서 인증번호 4자리를 받아온다.
	 * @author blue
	 *
	 */
	public class backgroundThreadCertificationStep_1 extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadCertificationStep_1");
			showPb();

			// 파라미터 세팅
			PushChatSMS pushChatSMSParam = new PushChatSMS();
			pushChatSMSParam.setPhoneNumber(userPhoneNumber.getText()+"");
			Log.d(TAG,"userPhoneNumber:"+userPhoneNumber.getText()+"");
			// 서버 메소드 호출
			callResult = pushChatRest.RestRequestCertification(pushChatSMSParam);
			// 결과 처리
			hidePb();
			if(callResult.equals("SUCCESS")){							// 인증번호 요청 성공
				showResultDialog(getString(R.string.certi_num_req_success));	
			}else{														// 인증번호 요청 실패
				showResultDialog(getString(R.string.certi_num_req_fail));
			}
			return null; 
		}
	}

	/**
	 * 러너블. 전화번호,인증번호 4자리를 보내서 승인을 받는다.
	 */
	class RunnableCertificationStep_2 implements Runnable {
		public void run(){
			new backgroundThreadCertificationStep_2().execute();	
		}
	}
	/**
	 * backgroundThreadCertificationStep_2
	 * 비동기 스레드.  전화번호,인증번호 4자리를 보내서 승인을 받는다.
	 * @author blue
	 *
	 */
	public class backgroundThreadCertificationStep_2 extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadCertificationStep_2");
			showPb();
			// 파라미터 세팅
			PushChatSMS pushChatSMSParam = new PushChatSMS();
			pushChatSMSParam.setPhoneNumber(userPhoneNumber.getText()+"");
			pushChatSMSParam.setCertificationNumber(userCertiNumber.getText()+"");
			// 서버 메소드 호출
			callResult = pushChatRest.RestRequestAdmission(pushChatSMSParam);	
			// 결과 처리
			hidePb();
			// SUCCESS_ADMISSION		// 인증 성공
			// SUCCESS_NON_EXIST		// 인증 실패 - 인증 정보 없음
			// SUCCESS_NOT_ADMISSION	// 인증 실패 - 인증 번호 불일치.
			// FAIL 		// 실패
			if(callResult.equals("SUCCESS_ADMISSION")){				// 인증 성공		, 등록 필요.
				Log.i(TAG, "SUCCESS_ADMISSION");
				userCertifiedComplete2();
			}else{														// 인증 실패
				Log.i(TAG, "FAIL_ADMISSION");
				showResultDialog(getString(R.string.certi_fail));
			}
			return null; 
		}
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 유틸

	/**
	 * hideKeyboard
	 * 키보드 숨긴다
	 *
	 * @param 
	 * @param 
	 * @return nowTime
	 */
	public void hideKeyboard(){
		imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE );
		imm .hideSoftInputFromWindow(userCertiNumber.getWindowToken(), 0);
	}


	public void alertMsg(){			// 인증 실패 메시지
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						String alrtMsg = getString(R.string.certi_fail_msg);
						b.putInt("showErrToast", 1);
						b.putString("msg", alrtMsg);			
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}

	public Context returnThis(){
		return this;
	}
	/**
	 * showResultDialog
	 * 얼럿을 띄운다
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showResultDialog(final String msg){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showAlert", 1);
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	// 인증 확인 토스트를 띄우고  다음 화면으로.
	public void showResultDialog2(final String msg){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showAlert", 2);
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}


	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
}
